<?php

namespace app\controller\test;


use app\model\content\ContentBlogModel;
use app\model\site\SiteTopicModel;
use app\service\Cache\Cache;

class Reflex extends Base
{
	// TODO 反射 测试

	
	public function index()
	{
		// 使用反射类获取当前控制器的类名
		$reflect = new \ReflectionClass(self::class);
		$cline   = '<br>';
		
		// 获取类的方法列表
		$methods = $reflect->getMethods();
		foreach($methods as $method){
			echo '方法'.$method->getName().$cline;
		}
		
		echo $cline.$cline;
		// 获取类的属性列表
		$properties = $reflect->getProperties();
		foreach($properties as $property){
			echo '属性'.$property->getName().$cline;
		}
	}
	
	public function test2()
	{
		//如果存在控制器名字的类
		//利用反射api构造一个控制器类对应的反射类
		$rc = new \ReflectionClass($this->getController());
		//如果该类实现了IController接口
		if($rc->implementsInterface('Icontroller')){
			//该类拥有解析后的action字符串所指向的方法名
			if($rc->hasMethod($this->getAction())){
				//构造一个控制器的示例
				$controller = $rc->newInstance();
				
				//获取该类$action参数所指向的方法对象
				$method = $rc->getMethod($this->getAction());
				
				//反射类方法对象的调用方式：
				$method->invoke($controller);
			}
		}
	}
	
	public function test()
	{
		// 使用反射类获取当前控制器的类名
		$reflect = new \ReflectionClass(self::class);
		$cline   = '<br>';
		
		// TODO 反射：用于获取当前类的当前方法的所有的参数 用于缓存
		
		// 获取方法的反射方法对象
		$method = $reflect->getMethod('queryField');
		
		// 设置可访问性，以便我们可以调用私有或受保护的方法
		$method->setAccessible(true);
		
		// 获取类的实例
		//$instance = $reflect->newInstance($this->app);
		
		// 调用方法并传递参数
		//$result = $method->invokeArgs($instance, array('Hello', 'World'));
		
		
		// 获取类的方法列表
		echo '方法'.$method.$cline;
		
		
		echo $cline.$cline;
		// 获取类的属性列表
		$properties = $method->getParameters();
		foreach($properties as $property){
			echo '参数：名'.$property->getName().$cline;
			echo '参数：值'.$property->getDefaultValue().$cline;
			//echo '参数：值'.$property->getValue().$cline;
			echo $cline.$cline;
		}
		
		//$args = $this->bindParams($reflect, $vars);
		//$reflect->invokeArgs($instance, $args);
	}
	
	##################################################################################
	// 查询时候的缓存字段
	protected function queryField($field1 = 'id', $field2 = 'uid', $aa = __FUNCTION__)
	{
		// $aa 可以获取调取方法的方法名称
		return [$field1, $field2, $aa];
	}
	
	// 数据表的缓存
	protected function tableCacheField()
	{
		return ['id', 'site_id', 'uid', 'company_id', 'top_id', 'event_id', 'poll_id', 'mtag_id', 'user_class_id', 'class_id', 'status',];
	}
	
}


